#! /usr/bin/env python

# Create By GF 2023-07-09 13:22

# PyX_Demo_2维列表(2D-List)_Explain_GF_2023-07-09.py

# ----------------------------------------------------------------------------------------------------
# 1. 本质

# 二维数组本质上是以列表作为列表元素的列表。

# 简单理解就是：二维数组的元素还是列表。

# ----------------------------------------------------------------------------------------------------
# 2. 创建二维列表

# 例如：创建2行3列的二维数组，也就是两个一维列表,每个一维列表有三个元素(相当于2行3列)

arr = [[0,1,2],
       [0,1,2]]

# +------+----------+----------+----------+
# |行\列 |第0列     |第1列     |第2列     |
# +------+----------+----------+----------+
# |Arr0  |Arr[0][0] |Arr[0][1] |Arr[0][2] |
# |Arr1  |Arr[1][0] |Arr[1][1] |Arr[1][2] |
# +------+----------+----------+----------+

# 2.1. 创建一个空列表

arr = [] 

for i in range(2):
    arr.append([])
    for j in range(3):
        arr[i].append(j)


# 2.2. 遍历列表

for i in arr:
    print(i)

# 打印结果：

#>>> for i in arr:
#    print(i)
#
#    
#[0, 1, 2]
#[0, 1, 2]

# ----------------------------------------------------------------------------------------------------
# 3. “读” 二维列表

# 注意：

# [0][0] 代表第1个一维数组的第一个元素(第一行一列)

# [1][0] 代表第2个一维数组的第一个元素(第二行一列)

arr = [[0,1,2],
       [0,1,2]]

print(arr[0][1]) # 1
print(arr[1][0]) # 0

# Output:

#>>> print(arr[0][1])
#1

#>>> print(arr[1][0])
#0

# ----------------------------------------------------------------------------------------------------
# 4. “写” 二维列表。

arr = [[],[]]

arr[0] = [1,2,3]
arr[1] = [4,5,6]

# Output:

#>>> arr
#[[1, 2, 3], [4, 5, 6]]

# 4.1 “改” 二维列表。

arr = [[0,1],[0,1]]

arr[0][1] = 3
arr[1][1] = 6

# Output:

#>>> arr
#[[0, 3], [0, 6]]

# ----------------------------------------------------------------------------------------------------
# 5. 遍历二维列表

arr = [[0,1,2],[0,1,2]]

# 外层循环列表。
for i in range(2):
    # 内循环每个列表中的元素。
    for j in range(3):
        print(arr[i][j], end=' ')
    print('')
    
# Output:

#>>> for i in range(2):
#        for j in range(3):
#            print(arr[i][j], end=' ')
#        print('')
#
#    
#0 1 2 
#0 1 2 

# ----------------------------------------------------------------------------------------------------
# 6. 练习1

arr=[[1,2,3],
     [4,5,6]]

# 6.1 将二维列表 arr 输出为如下效果。
   
# 1 4 
# 2 5 
# 3 6
     
# 1的下标：[0][0]   4的下标：[1][0]
# 2的下标：[0][1]   5的下标：[1][1]
# 3的下标：[0][2]   5的下标：[1][2]

# 6.1.1 解法1
for j in range(3):
    for i in range(2):
        print(arr[i][j], end=' ')
    print()
   
# 6.1.2 解法2
for i in range(3):
   for j in range(2):
       print(arr[j][i], end=' ')
   print()

# 6.2 将二维列表 arr 输出为如下效果。

# 4 1 
# 5 2 
# 6 3

# 6.2.1 解法1
for j in range(3):
    for i in range(1,-1,-1):
        print(arr[i][j], end=' ')
    print()

# 6.2.2 解法2
for i in range(3):
   for j in range(1,-1,-1):
       print(arr[j][i], end=' ')
   print()

# ----------------------------------------------------------------------------------------------------
# 7. 练习2

arr=[[1,2,3,4,5],
     [5,6,7,8,9],
     [3,4,5,6,7]]

# 将二维列表 arr 输出为如下效果。

# 3 4 5 6 7 
# 5 6 7 8 9 
# 1 2 3 4 5

# .reverse() 会对列表的元素进行反向排序。
arr.reverse() 

for i in range(3):
    for j in range(5):
        print(arr[i][j], end=' ')
    print()

# ----------------------------------------------------------------------------------------------------
# EOF
